home *** CD-ROM | disk | FTP | other *** search
/ Loadstar 128 13 / q13.d81 / t.zero page 13 < prev    next >
Text File  |  2022-08-28  |  9KB  |  178 lines

  1.                  ZERO PAGE  -  P R O F E S S O R    B I N G O
  2.  
  3.                                by Fender Tucker
  4.  
  5.      This is my first foray into the 80-column wilderness of the VDC chip
  6. and I've got to say in my most Teutonic voice, "I'll be back."  The wide
  7. screen is a stylist's dream and a real boon to programming.  As a BASIC 2.0
  8. programmer, I have been a little leery of the quirks of the 80-column mode,
  9. but Jon Mattson's CONTROL 80 gave me the utilities I've come to rely on in
  10. my 64 programs, such as PEEKing, POKEing, screen saving, custom fonting,
  11. etc.  Jon says he automatically installs CONTROL 80 before every 80-column
  12. programming session, and I second his policy.
  13.  
  14.      The program is not a complicated one, so I thought it might be
  15. instructional for me to annotate it for those of you who have ideas for
  16. 80-column programs, but haven't started programming yet.  But first, the
  17. game itself.
  18.  
  19.      I got the idea for a mathematical bingo game from some flash cards for
  20. youngsters.  Instead of the bingo caller simply calling out numbers, how
  21. about if he called out mathematical expressions that the players had to
  22. evaluate before they could mark their cards?  The rules of bingo stay the
  23. same: the first player to get five squares in a row, horizontally,
  24. vertically or diagonally, wins.
  25.  
  26.      My first concern was logistics.  Getting two cards on a 40-column
  27. screen would have been a nightmare, but the huge screen is perfect for it. 
  28. So I began the program by installing CONTROL 80 and drawing the screen.  I
  29. knew I'd need a font so I made one up using a font making program and
  30. installed it with CONTROL 80's FCOPY command.  The font 'evolved' as the
  31. program progressed and I found I wanted new characters and shapes.
  32.  
  33.      If you look at my code, however, you won't find any screen drawing
  34. routine.  I took the code out after I had the screen as I wanted, AFTER I
  35. had saved the screen with a simple BSAVE.  Now line 101 loads the screen,
  36. saving code and time (if you have JiffyDOS), at the expense of disk space
  37. for the 17-block 'scrn' file.  This wasn't necessary; I just felt like
  38. experimenting.
  39.  
  40.      Some of the screen drawing routines still remain as subroutines (lines
  41. 20-30).  I needed these for the square cursors and rectangles.
  42.  
  43.      I wanted the numbers on the cards to follow the standard bingo format:
  44. under the B, 1 through 15; under the I, 16 through 30, etc.  Lines 250-280
  45. do the job.  It's basically a triple-nested loop to generate the array
  46. d(player,column,row).
  47.  
  48.      Then I worked on the interface (lines 300-390).  This is the only
  49. complicated part of the program and it's complicated only because I wanted
  50. the keyboard and joystick to work simultaneously.  It's not a foolproof
  51. system and if either player insists on keeping his cursor moving (in other
  52. words, being an ass) the other player has a sluggish cursor.  I originally
  53. had the keyboard use the CRSR keys but I encountered anomalies when the
  54. SHIFT key is pressed and the joystick is moved.  One of them caused a "break
  55. in 302" which I've never figured out.  So I changed the keyboard interface
  56. so it uses the number keypad.  The 4-5-6-8-ENTER 'diamond' is similar to the
  57. IBM cursor or the old Apple I-J-K-L diamonds.
  58.  
  59.      About this time I decided that I wanted the game to have levels, so
  60. that players could make the game as easy or as difficult as they wanted. 
  61. The interface for choosing the level was placed at 900-985.  It's a standard
  62. highlight bar menu except that when you choose a level, all lower levels are
  63. chosen too.  I placed the levels in a natural hierarchy -- at least, to me.
  64.  
  65.      The number of seconds between calls creates what I call a 'frantic
  66. factor'.  Since there are only four expressions showing at a time, if you
  67. choose a ridiculously short period of time like 2 seconds, each expression
  68. is shown only for 8 seconds.  I find 5 seconds to be about right for a tense
  69. game; 9 is a much more leisurely pace.  Note that the expressions are
  70. displayed in order from left to right, EXCEPT when a player uses one.  Then
  71. that expression is replaced and the cycle is continued from that rectangle. 
  72. Part of the strategy is to evaluate the expressions that have short lives
  73. before expressions that will live longer.  Once an expression is used, it
  74. goes away, so if both players can use the expression, it becomes a race.
  75.  
  76.      Finally I came to the algorithms that generate the random expressions
  77. that appear at the top of the screen.  I wanted them to be fast so I put
  78. them in subroutines with low numbers.  Just about all of my programs start
  79. with some setup lines then GOTO 100, reserving line numbers 20-99 for
  80. subroutines.  The algorithms were a lot of fun; sort of like little logic
  81. problems.  The trick was to insure that numbers from 1 through 75 were
  82. chosen RANDOMLY, without favoritism for numbers under the B or I over
  83. numbers under the G or O.  Did I do it?  I think so; you tell me.  The line
  84. numbers for each algorithm are:
  85.  
  86. 60 - addition
  87.  
  88. 62, 63 - subtraction
  89.  
  90. 64, 65 - multiplication
  91.  
  92. 66, 67 - division
  93.  
  94. 68 - hex numbers
  95.  
  96. 70, 71 - numbers raised to a power
  97.  
  98. 72-80 - trig functions
  99.  
  100. One number is u, the other is q, u$ is the expression and v is the value of
  101. the expression.
  102.  
  103.      Note that LEVEL FIVE (hexadecimal numbers) does not choose an
  104. expression as the others do.  I figured it's tough enough to translate $4A
  105. to decimal; doing something like $2B + $1C would tax even a Scott Resh or a
  106. Rick Nash.  I think.
  107.  
  108.      Also note that the expressions generated by LEVEL SIX (numbers raised
  109. to a power) are pared down for speed.  I didn't want the program to hang up
  110. trying numbers like 34^56 hoping to find one whose value was less than 75,
  111. so I made the first number be 8 or less and the exponent be 3 or less.
  112.  
  113.      LEVEL SEVEN (trig functions) was an afterthought.  No one knows the
  114. value of sin53 but there are are a few identities that are worth
  115. remembering.  Hint: all of the trig functions equal 0, 1/2 or 1.
  116.  
  117.      The last things I did were the bingo check at 400 and the help display
  118. routine at 500 (after it's initially drawn at 800).  There is room below
  119. BASIC for two stored screens - one at 8192 and another at 12288.  Once the
  120. help screen is drawn, it's STOREd at 12288 and RECALLed when needed, rather
  121. than redrawn.  The current screen is STOREd at 8192.  Obviously I'm not a
  122. renumberer.  I use the decimal system to keep track of my routines and
  123. squash line numbers in as needed, occasionally renumbering by hand.  Maybe
  124. not the best method, but it's mine.
  125.  
  126.      Here are a few lines that merit mention:
  127.  
  128. 3 : peek(186) is the last I/O device used.  Please use this in all LOADSTAR
  129. programs.
  130.  
  131. 5 : frees up memory from $1c00 to $4000 for CONTROL 80, screens, ML, etc.
  132.  
  133. 10-13 : install CONTROL 80 and font
  134.  
  135. 40-44 : nifty way of changing the tile background.  Note that 80-column font
  136. characters are 16 'wide', unlike 40-column font characters that are 8 wide. 
  137. The background consists of nothing but @ signs, which is defined by the
  138. first eight bytes of the font at 8192-8199.  This routine POSTs (CONTROL
  139. 80's version of POKE) the data for five other tiles into those bytes
  140. whenever an expression is evaluated correctly.
  141.  
  142. 90-92 : my favorite way of drawing dialog boxes.  Define top, middle and
  143. bottom strings (lines 106-109) and use a FOR-NEXT loop for the middae
  144. string.  Then a  W=7:GOSUB90  command will draw a box 7 rows high.
  145.  
  146. 101 : this BLOADS the saved screen into normal RAM and the STORE command
  147. moves it into placeain the VDC chip.  Jon Mattson's memory map of the VDC
  148. from his CONTROL 80 docs is the most succinct I've seen.
  149.  
  150.      $0000 - 07FF       0 - 2047   Screen
  151.      $0800 - 0FFF    2048 - 4095   Attributes
  152.      $1000 - 1FFF    4096 - 8191   Unused
  153.      $2000 - 2FFF    8192 - 12287  Uppercase/Graphic font
  154.      $3000 - 3FFF   12288 - 16383  Lower/Uppercase font
  155.  
  156. 102 : I got tired of typing  U=INT(RND(1)*75)+1 so I defined a function to
  157. make life easier.  With this function, U=FNR(75) does the same thing.  The
  158. number in parentheses defines the limits of the random numbers generated, 1
  159. through 75 in this case.
  160.  
  161. 115 : easy screen swap.  Remember the commands STORE 4096,0,8192,0 and
  162. RECALL 4096,0,8192,0 and you've got win